package com.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置序列化器
 */
@Configuration
public class RedisConfig {
    /**
     * Redis的主从复制模式下， 一旦主节点由于故障不能提供服务， 需要人工将从节点晋升为主节点， 同时还要通知应用方更新主节点地址， 对于很多应用场景这种故障处理的方式是无法接受的。
     *
     * 哨兵模式介绍
     *  Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态
     *  在Master主服务器发生故障的时候，可以实现Master和Slave服务器的切换，保证系统的高可用（HA）
     *  其已经被集成在redis2.6+的版本中，Redis的哨兵模式到了2.8版本之后就稳定了下来。
     */

    /**
     * 配置集群 方法一
     * 一主二从配置  配置redis.windows.conf文件 REPLICATION 的 slaveof (port:xxxx) 将该机器设置为从机还是主机
     * 配置集群 方法一  层层链路配置
     * 主机 < (从机|主机) < 从机
     * 让中间的服务设置成(从机|主机)
     * {一旦主机宕机，手动将中间的从机变成主机，但是如果原主机修复后，则后主机依旧是主机，“极不方便”}
     * Redis 哨兵模式(自动选择主机的模式) 先要配置主从模式
     *  哨兵模式一般情况下都至少会有 三个sentinel 三台Redis服务器 相互监控
     *  . 每个Redis服务下 创建一个sentinel.config文件
     *  . 修改参数 sentinel monitor mymaster 127.0.0.1 6379 1 (设置要监视服务器的端口)
     *  . 如果发现master 主机宕机后，sentinel之间会马上进行投票(投票算法)挑选一台从机变成主机
     *  . 如果此时原主机回来了，只能归并到新的主机下当做从机。这就是哨兵模式的规则
     */

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,Object>template=new RedisTemplate<>();
        //关联
        template.setConnectionFactory(factory);
        //设置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化器
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }
}
